{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "720b394a",
   "metadata": {},
   "outputs": [],
   "source": [
    "sqlList = [\n",
    "                    \"-- 将触发器数据灌入 vlt_tmp_a 表\\n                INSERT INTO vlt_tmp_a (\\n                    d0_rowid, setl_id, psn_no, hsp_abbr, j_year, j_isin, item_j_code, item_j_name, item_time, item_day, item_hour, item_dept, q, p, c, b\\n                )\\n                SELECT\\n                    d0_rowid, setl_id, psn_no, hsp_abbr, j_year, j_isin, item_j_code, item_j_name, item_time, item_day, item_hour, item_dept, q, p, c, b\\n                FROM d \\n                WHERE 1=1\\n            AND d.item_time >= to_date('2020-01-01', 'yyyy-mm-dd')\\nAND d.item_time <= to_date('2099-12-31', 'yyyy-mm-dd')\\nAND d.hsp_abbr = '民生'\\nAND d.b <> 0\\nAND (\\n    d.item_j_code IN ('220800008','002208000080000-220800008')\\n)\",\n",
    "                    \"TRUNCATE TABLE vlt_tmp_b\",\n",
    "                    \"TRUNCATE TABLE vlt_tmp_b2\",\n",
    "                    \"-- item，step1. 查出 va 表中符合违规范围的（即有或者没有对应项目的） ，放在 vb 表\\nINSERT into vlt_tmp_b (\\n    setl_id, item_day\\n)\\nSELECT\\n    va.setl_id, va.item_day\\nFROM vlt_tmp_a va\\nWHERE NOT EXISTS(\\n    select 1\\n    from d\\n    where va.j_isin = d.j_isin and va.j_year = d.j_year and va.hsp_abbr = d.hsp_abbr\\n        and va.setl_id = d.setl_id AND va.item_day = d.item_day\\n        AND (d.item_j_code IN ('002207000050000-220700005','002202010020000-220201002','220700006','002203010010000-220301001-2','220201010S','220203005','220302005','002203010020000-220301002','220700005','002206000100000-220600010-1','002203020060001-220302006-1','220700004','002203020100000-220302010','442206000080100-220600008-1','002202010090000-220201009','002202030050000-220203005','220203002','220202001','220600004-1','002202010050000-220201005','002203010010000-220301001','220400001','220100003','220302003-1','220302012','220201002','002203020120000-220302012','220301001','002204000010000-220400001','002203020080000-220302008','220302004','220302008','220600004','002206000080000-220600008','002202020020000-220202002','220600010-1','002202030020000-220203002','220302006-1','002202020010000-220202001','002203020050000-220302005','002201000030000-220100003','220201003','220302007','002207000040000-220700004','002206000040001-220600004-1','220302003','442203020130000-220201010S','002203020070000-220302007','220500001','220600002','002203020030000-220302003','002203020060000-220302006','002202010030000-220201003','002205000010000-220500001','220203001','002207000060000-220700006','002203020040000-220302004','220302006','002203020010000-220302001','220301002','002202030010000-220203001','002207000010000-220700001','002206000040000-220600004'))\\n\\n)\",\n",
    "                    \"-- item，stepp2. 删除 va 表中没有 vb 的部分\\nDELETE FROM vlt_tmp_a va\\nWHERE NOT EXISTS(\\n    SELECT 1\\n    FROM vlt_tmp_b vb\\n    WHERE vb.setl_id = va.setl_id AND vb.item_day = va.item_day\\n)\",\n",
    "                    \"-- violate price，默认处理，使的没有被更新的 vlt_p 直接等于 p\\nUPDATE vlt_tmp_a va SET va.vlt_p = va.p WHERE va.vlt_p IS NULL\",\n",
    "                    \"-- violate num，默认处理，使的没有被更新的 vlt_q 直接等于 q\\nUPDATE vlt_tmp_a va SET va.vlt_q = va.q WHERE va.vlt_q IS NULL\",\n",
    "                    \"-- 计算 vlt_c\\nUPDATE vlt_tmp_a va SET va.vlt_c = va.vlt_p * va.vlt_q WHERE va.vlt_c IS NULL\",\n",
    "                    \"-- 计算 vlt_b\\nUPDATE vlt_tmp_a va\\nSET va.vlt_b = CASE\\n    WHEN va.c IS NULL OR va.c = 0 THEN 0\\n    ELSE va.vlt_c * va.b / va.c\\nEND\\nWHERE va.vlt_b IS NULL\",\n",
    "                    \"-- 将 vlt_tmp_a 中的数据插入到 vlt 表中\\nINSERT INTO vlt (\\n    d0_rowid, \\n    setl_id, psn_no, hsp_abbr, j_year, j_isin, \\n    item_j_code, item_j_name, item_time, item_day, q, p, c, b,\\n    item_j_code2, item_j_name2, item_code2, item_name2, item_med_code2, item_hsp_code2, item_hsp_name2, item_time2, item_dept2, p2, q2, c2, b2,\\n    vlt_q, vlt_p, vlt_c, vlt_b,\\n    rule_id, rule_act_id, rule_act_msg\\n)\\nSELECT \\n    d0_rowid, \\n    setl_id, psn_no, hsp_abbr, j_year, j_isin, \\n    item_j_code, item_j_name, item_time, item_day, q, p, c, b,\\n    item_j_code2, item_j_name2, item_code2, item_name2, item_med_code2, item_hsp_code2, item_hsp_name2, item_time2, item_dept2, p2, q2, c2, b2,\\n    vlt_q, vlt_p, vlt_c, vlt_b,\\n    'F7' AS rule_id, 'F7_0' AS rule_act_id, '' AS rule_act_msg\\nFROM vlt_tmp_a va\"\n",
    "                ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c9c33431",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TRUNCATE TABLE vlt_tmp_a;\n",
      "-- 将触发器数据灌入 vlt_tmp_a 表\n",
      "                INSERT INTO vlt_tmp_a (\n",
      "                    d0_rowid, setl_id, psn_no, hsp_abbr, j_year, j_isin, item_j_code, item_j_name, item_time, item_day, item_hour, item_dept, q, p, c, b\n",
      "                )\n",
      "                SELECT\n",
      "                    d0_rowid, setl_id, psn_no, hsp_abbr, j_year, j_isin, item_j_code, item_j_name, item_time, item_day, item_hour, item_dept, q, p, c, b\n",
      "                FROM d \n",
      "                WHERE 1=1\n",
      "            AND d.item_time >= to_date('2020-01-01', 'yyyy-mm-dd')\n",
      "AND d.item_time <= to_date('2099-12-31', 'yyyy-mm-dd')\n",
      "AND d.hsp_abbr = '民生'\n",
      "AND d.b <> 0\n",
      "AND (\n",
      "    d.item_j_code IN ('220800008','002208000080000-220800008')\n",
      ");\n",
      "-----------------------------------\n",
      "TRUNCATE TABLE vlt_tmp_b;\n",
      "-----------------------------------\n",
      "TRUNCATE TABLE vlt_tmp_b2;\n",
      "-----------------------------------\n",
      "-- item，step1. 查出 va 表中符合违规范围的（即有或者没有对应项目的） ，放在 vb 表\n",
      "INSERT into vlt_tmp_b (\n",
      "    setl_id, item_day\n",
      ")\n",
      "SELECT\n",
      "    va.setl_id, va.item_day\n",
      "FROM vlt_tmp_a va\n",
      "WHERE NOT EXISTS(\n",
      "    select 1\n",
      "    from d\n",
      "    where va.j_isin = d.j_isin and va.j_year = d.j_year and va.hsp_abbr = d.hsp_abbr\n",
      "        and va.setl_id = d.setl_id AND va.item_day = d.item_day\n",
      "        AND (d.item_j_code IN ('002207000050000-220700005','002202010020000-220201002','220700006','002203010010000-220301001-2','220201010S','220203005','220302005','002203010020000-220301002','220700005','002206000100000-220600010-1','002203020060001-220302006-1','220700004','002203020100000-220302010','442206000080100-220600008-1','002202010090000-220201009','002202030050000-220203005','220203002','220202001','220600004-1','002202010050000-220201005','002203010010000-220301001','220400001','220100003','220302003-1','220302012','220201002','002203020120000-220302012','220301001','002204000010000-220400001','002203020080000-220302008','220302004','220302008','220600004','002206000080000-220600008','002202020020000-220202002','220600010-1','002202030020000-220203002','220302006-1','002202020010000-220202001','002203020050000-220302005','002201000030000-220100003','220201003','220302007','002207000040000-220700004','002206000040001-220600004-1','220302003','442203020130000-220201010S','002203020070000-220302007','220500001','220600002','002203020030000-220302003','002203020060000-220302006','002202010030000-220201003','002205000010000-220500001','220203001','002207000060000-220700006','002203020040000-220302004','220302006','002203020010000-220302001','220301002','002202030010000-220203001','002207000010000-220700001','002206000040000-220600004'))\n",
      "\n",
      ");\n",
      "-----------------------------------\n",
      "-- item，stepp2. 删除 va 表中没有 vb 的部分\n",
      "DELETE FROM vlt_tmp_a va\n",
      "WHERE NOT EXISTS(\n",
      "    SELECT 1\n",
      "    FROM vlt_tmp_b vb\n",
      "    WHERE vb.setl_id = va.setl_id AND vb.item_day = va.item_day\n",
      ");\n",
      "-----------------------------------\n",
      "-- violate price，默认处理，使的没有被更新的 vlt_p 直接等于 p\n",
      "UPDATE vlt_tmp_a va SET va.vlt_p = va.p WHERE va.vlt_p IS NULL;\n",
      "-----------------------------------\n",
      "-- violate num，默认处理，使的没有被更新的 vlt_q 直接等于 q\n",
      "UPDATE vlt_tmp_a va SET va.vlt_q = va.q WHERE va.vlt_q IS NULL;\n",
      "-----------------------------------\n",
      "-- 计算 vlt_c\n",
      "UPDATE vlt_tmp_a va SET va.vlt_c = va.vlt_p * va.vlt_q WHERE va.vlt_c IS NULL;\n",
      "-----------------------------------\n",
      "-- 计算 vlt_b\n",
      "UPDATE vlt_tmp_a va\n",
      "SET va.vlt_b = CASE\n",
      "    WHEN va.c IS NULL OR va.c = 0 THEN 0\n",
      "    ELSE va.vlt_c * va.b / va.c\n",
      "END\n",
      "WHERE va.vlt_b IS NULL;\n",
      "-----------------------------------\n",
      "-- 将 vlt_tmp_a 中的数据插入到 vlt 表中\n",
      "INSERT INTO vlt (\n",
      "    d0_rowid, \n",
      "    setl_id, psn_no, hsp_abbr, j_year, j_isin, \n",
      "    item_j_code, item_j_name, item_time, item_day, q, p, c, b,\n",
      "    item_j_code2, item_j_name2, item_code2, item_name2, item_med_code2, item_hsp_code2, item_hsp_name2, item_time2, item_dept2, p2, q2, c2, b2,\n",
      "    vlt_q, vlt_p, vlt_c, vlt_b,\n",
      "    rule_id, rule_act_id, rule_act_msg\n",
      ")\n",
      "SELECT \n",
      "    d0_rowid, \n",
      "    setl_id, psn_no, hsp_abbr, j_year, j_isin, \n",
      "    item_j_code, item_j_name, item_time, item_day, q, p, c, b,\n",
      "    item_j_code2, item_j_name2, item_code2, item_name2, item_med_code2, item_hsp_code2, item_hsp_name2, item_time2, item_dept2, p2, q2, c2, b2,\n",
      "    vlt_q, vlt_p, vlt_c, vlt_b,\n",
      "    'F7' AS rule_id, 'F7_0' AS rule_act_id, '' AS rule_act_msg\n",
      "FROM vlt_tmp_a va;\n",
      "-----------------------------------\n"
     ]
    }
   ],
   "source": [
    "print('TRUNCATE TABLE vlt_tmp_a;')\n",
    "for sql in sqlList:\n",
    "    print(sql+';')\n",
    "    print('-----------------------------------')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2a1169f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 警告：规则 D53 的动作 D53_0 中的 SQL 超过了 4000 字符，长度为 10830\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5d34e152",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "警告：规则 D53 的动作 D53_0 中的 SQL 超过了 4000 字符，长度为 10830\n",
      "警告：规则 D54 的动作 D54_0 中的 SQL 超过了 4000 字符，长度为 5188\n",
      "警告：规则 D55 的动作 D55_0 中的 SQL 超过了 4000 字符，长度为 16540\n",
      "警告：规则 D51 的动作 D51_0 中的 SQL 超过了 4000 字符，长度为 23784\n",
      "警告：规则 D41 的动作 D41_0 中的 SQL 超过了 4000 字符，长度为 7084\n",
      "警告：规则 I138 的动作 I138_0 中的 SQL 超过了 4000 字符，长度为 4328\n",
      "警告：规则 I138 的动作 I138_0 中的 SQL 超过了 4000 字符，长度为 5340\n",
      "警告：规则 I138 的动作 I138_0 中的 SQL 超过了 4000 字符，长度为 16446\n",
      "警告：规则 D17 的动作 D17_0 中的 SQL 超过了 4000 字符，长度为 8614\n",
      "警告：规则 D47 的动作 D47_0 中的 SQL 超过了 4000 字符，长度为 8614\n",
      "警告：规则 H36 的动作 H36_0 中的 SQL 超过了 4000 字符，长度为 21499\n",
      "警告：规则 H42 的动作 H42_0 中的 SQL 超过了 4000 字符，长度为 23488\n",
      "警告：规则 H40 的动作 H40_0 中的 SQL 超过了 4000 字符，长度为 22946\n",
      "警告：规则 H38 的动作 H38_0 中的 SQL 超过了 4000 字符，长度为 17816\n",
      "警告：规则 H41 的动作 H41_0 中的 SQL 超过了 4000 字符，长度为 28404\n",
      "警告：规则 H37 的动作 H37_0 中的 SQL 超过了 4000 字符，长度为 24406\n",
      "警告：规则 H39 的动作 H39_0 中的 SQL 超过了 4000 字符，长度为 17462\n",
      "警告：规则 D34 的动作 D34_0 中的 SQL 超过了 4000 字符，长度为 14422\n",
      "警告：规则 D20 的动作 D20_0 中的 SQL 超过了 4000 字符，长度为 24173\n",
      "警告：规则 A213 的动作 A213_0 中的 SQL 超过了 4000 字符，长度为 5873\n",
      "警告：规则 D29 的动作 D29_0 中的 SQL 超过了 4000 字符，长度为 4558\n",
      "警告：规则 H30 的动作 H30_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H31 的动作 H31_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H32 的动作 H32_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H49 的动作 H49_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H50 的动作 H50_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H52 的动作 H52_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 H53 的动作 H53_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 I187 的动作 I187_0 中的 SQL 超过了 4000 字符，长度为 19449\n",
      "警告：规则 H19 的动作 H19_0 中的 SQL 超过了 4000 字符，长度为 10014\n",
      "警告：规则 I201 的动作 I201_0 中的 SQL 超过了 4000 字符，长度为 5397\n",
      "警告：规则 H14 的动作 H14_0 中的 SQL 超过了 4000 字符，长度为 4404\n",
      "警告：规则 D28 的动作 D28_0 中的 SQL 超过了 4000 字符，长度为 8134\n",
      "警告：规则 I137 的动作 I137_0 中的 SQL 超过了 4000 字符，长度为 5397\n",
      "警告：规则 M273 的动作 M273_0 中的 SQL 超过了 4000 字符，长度为 10230\n",
      "警告：规则 M56 的动作 M56_0 中的 SQL 超过了 4000 字符，长度为 24737\n",
      "警告：规则 M199 的动作 M199_0 中的 SQL 超过了 4000 字符，长度为 5441\n",
      "警告：规则 M259 的动作 M259_0 中的 SQL 超过了 4000 字符，长度为 7220\n",
      "警告：规则 M101 的动作 M101_1 中的 SQL 超过了 4000 字符，长度为 21284\n",
      "警告：规则 M101 的动作 M101_1 中的 SQL 超过了 4000 字符，长度为 22153\n",
      "警告：规则 M93 的动作 M93_0 中的 SQL 超过了 4000 字符，长度为 7220\n",
      "警告：规则 M162 的动作 M162_0 中的 SQL 超过了 4000 字符，长度为 7220\n",
      "警告：规则 M284 的动作 M284_0 中的 SQL 超过了 4000 字符，长度为 4380\n",
      "警告：规则 M175 的动作 M175_0 中的 SQL 超过了 4000 字符，长度为 10014\n",
      "警告：规则 M163 的动作 M163_0 中的 SQL 超过了 4000 字符，长度为 7217\n",
      "警告：规则 P76 的动作 P76_1 中的 SQL 超过了 4000 字符，长度为 5441\n",
      "最长的 SQL 长度为 28404 字符\n"
     ]
    }
   ],
   "source": [
    "# 读入 ruleData_generate_民生.json\n",
    "import json\n",
    "with open(r'D:\\规则维护\\ruleData_generated_民生.json', 'r', encoding='utf-8') as f:\n",
    "    ruleData_generate = json.load(f)\n",
    "# 遍历 ruleData_generate 的每个 ruleDatum 中的每个 ruleActDatum，看看有没有哪一个 sqlList 中的 sql 超过了4000 字符（ORACLE的限制）\n",
    "maxLen = 0\n",
    "for ruleDatum in ruleData_generate:\n",
    "    for ruleActDatum in ruleDatum.get('ruleActs', []):\n",
    "        sqlList = ruleActDatum.get('sqlList', [])\n",
    "        for sql in sqlList:\n",
    "            if len(sql) > maxLen:\n",
    "                maxLen = len(sql)\n",
    "            if len(sql) > 4000:\n",
    "                print(f\"警告：规则 {ruleDatum.get('ruleId')} 的动作 {ruleActDatum.get('ruleActId')} 中的 SQL 超过了 4000 字符，长度为 {len(sql)}\")\n",
    "print(f\"最长的 SQL 长度为 {maxLen} 字符\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
